package 面向对象.student2;

//创建一个长度为3的数组，创建学生对象并添加到数组中

//要求1：再添加一个学生对象，并在添加时进行学号唯一性判断
//在添加前判断学号唯一性
//把学号唯一的新对象添加到数组中，若数组未满，则直接添加；若数组已满，则创建一个新数组，新数组长度 = 原数组 + 1

//要求2：遍历所有学生信息

//要求3：通过id删除学生信息，如果存在，则删除，如果不存在，则提示删除失败。
public class StudentTest {

    //对id进行唯一性判断
    public static boolean contains(Student[] arr, int id) {
        //获取id
        for (int i = 0; i < arr.length; i++) {

            //获取每个学生的id
            Student s = arr[i];
            //判断学生对象是否为null
            if(s != null) {

                int sid = s.getId();//若学生对象为null，则会报空指针异常，所以要先判断学生对象是否为null

                //判断id是否存在
                if (sid == id) {
                    return true;
                }
            }
        }

        //若遍历完数组，还没有找到id，说明id不存在
        return false;

    }

    //判断数组已经存了几个元素
    public static int getCount(Student[] arr) {
        //定义一个计数器，用于统计数组中已存的元素
        int count = 0;

        for (int i = 0; i < arr.length; i++) {

            //判断数组中是否有元素
            if (arr[i] != null) {
                count++;
            }
        }
        //返回数组中已存的元素个数
        return count;
    }

    //创建新数组，新数组长度 = 原数组 + 1，把原数组中的元素复制到新数组中
    public static Student[] createNewArr(Student[] arr) {
        //创建新数组
        Student[] newArr = new Student[arr.length + 1];
        //把原数组中的元素复制到新数组中
        for (int i = 0; i < arr.length; i++) {
            newArr[i] = arr[i];
        }
        //返回新数组
        return newArr;
    }

    //遍历所有学生信息
    public static void printArr(Student[] arr) {
        for (int i = 0; i < arr.length; i++) {
            Student s = arr[i];
            //仅打印非null的元素
            if(s != null) {
                System.out.println(s.getId() + " " + s.getName() + " " + s.getAge());
            }
        }
    }

    //找到id在数组中的索引
    public static int getIndex(Student[] arr, int id) {
        for (int i = 0; i < arr.length; i++) {
            Student s = arr[i];
            //判断学生对象是否为null
            if(s!= null) {
                int sid = s.getId();
                if (sid == id) {
                    return i;
                }
            }
        }
        //若遍历完数组，还没有找到id，说明id不存在
        return -1;
    }

    public static void main(String[] args) {

        Student[] arr = new Student[3];
        Student s1 = new Student(1, "zhangsan", 18);
        Student s2 = new Student(2, "lisi", 19);
        Student s3 = new Student(3, "wangwu", 20);

        arr[0] = s1;
        arr[1] = s2;
        arr[2] = s3;

        Student s4 = new Student(4, "zhaoliu", 21);

        boolean flag = contains(arr, s4.getId());
        if (flag) {

            System.out.println("当前id重复，请修改id后再进行添加");

        } else {

            //id不重复，判断数组是否已满
            int count = getCount(arr);

            if(count == arr.length) {
                //数组已满，创建新数组并复制元素
                Student[] newArr = createNewArr(arr);
                //把新对象添加到数组中
                newArr[count] = s4;
                //遍历新数组
                printArr(newArr);
            } else {
                //数组未满，直接添加
                arr[count] = s4;//count也表示，如果要添加数据，就添加到这个索引的位置
                //遍历数组
                printArr(arr);
            }
        }

        //通过id删除学生信息
        int index = getIndex(arr, 1);
        if( index >= 0) {
            //存在则删除
            arr[index] = null;
            //遍历数组
            printArr(arr);
        } else {
            //不存在则提示删除失败
            System.out.println("删除失败，id不存在");
        }

    }
}
